const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo");

const app = express();
// 设置 session 的中间件
app.use(
  session({
    name: "sid", // 设置cookie的name，默认值时connet.sid
    secret: "atguigu", // 参与加密的字符串（有称为签名）
    saveUninitialized: false, // 是否为每次请求都设置一个cookie用来存储session的id
    resave: true, // 是否在每次请求时重新保存session（session生命周期过期后，重新保存，更新session的过期时间）
    store: MongoStore.create({
      mongoUrl: "mongodb://127.0.0.1:27017/bilibili", // 数据库的连接配置
    }),
    cookie: {
      httpOnly: true, // 开启后前端无法通过js操作
      maxAge: 1000 * 60 * 5, // 这一条时控制sessionID的过期时间
    },
  })
);

app.get("/", (req, res) => {
  res.send("请求成功");
});

// session设置
app.get("/login", (req, res) => {
  // username=admin&password=admin
  const { username, password } = req.query;
  if (username === "admin" && password === "admin") {
    // 设置session
    req.session.username = "admin";
    req.session.uid = "258aefccc";
    res.send("登录成功");
  } else {
    res.send("登录失败");
  }
});

// session的读取
app.get("/cart", (req, res) => {
  // 检测session是否存在用户数据
  if (req.session.username) {
    // 中间件已经从数据库读取session值,并保存在req.session中
    res.send(`购物车页面, 欢迎您${req.session.username}`);
  } else {
    res.send("您还没登录");
  }
});

// session的销毁
app.get("/logout", (req, res) => {
  req.session.destroy(() => {
    res.send("退出成功");
  });
});

app.listen(3000, () => {
  console.log("3000端口监听成功");
});
